package main

import (
	"fmt"
	"math/rand"
	"time"
)

/**
	select 方式进行调度

		使用场景：比如有多个通道，但我打算是哪一个通道先给我数据，我就先执行谁
		这个select 可以是并行执行 channel管道

 */

// 发送值
func generator() chan int {
	out := make(chan int)

	go func() {
		i := 0
		for {
			// 随机睡眠， 1500毫秒以内
			time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)

			// 往 out  这个channel里面传输 i 这个值
			out <- i
			i++
		}
	}()

	return out
}


func main() {

	/**
		如果 channel (chan) 是 nil, 在 select里面也是可以使用的，只不过是堵塞状态！
	 */

	// var c1, c2 chan int // c1 和 c2 是 nil
	var c1, c2 = generator(), generator() // 赋值

	// 从 channel里面接收数据
	//n1 := <- c1
	//n2 := <- c2

	/**
		上面两个通道有数据，是同类型的数据，但是我想谁先给我数据，我就要谁
	 */
	for  {
		select {
		case n := <- c1:
			fmt.Println("从 c1 获取到数据：", n)
		case n := <- c2:
			fmt.Println("从 c2 获取到数据：", n)
		case <- time.After(5 * time.Second): // 超时处理
			println("timeout")
		//default:
		//	fmt.Println("通道内。没有数据！")
		}
	}


}
